#include <typescommon.h>
#include <inttypes.h>

// 变量/常量	        分配地址空间	作用范围	                        作用周期
// 全局变量	            静态区	       整个进程，使用前需声明一下	          整个进程
// static静态全局变量	 静态区	        当前文件，使用前需声明一下	           整个进程
// 函数内静态变量	     静态区	        定义的函数，第一次调用函数进行初始化	 整个进程
// 局部变量	            栈区间	       函数内部	                           函数结束释放
// 动态分配	            堆区间	       整个进程。获得地址即可使用。需要释放。	手动释放，程序结束。
// 常量	               常量区	       跟变量一致，也有全局与局部。	          参考变量。
// 程序	               程序区		

// 全局变量，可以用于本程序(本进程)任何地方。只需要在调用前声明以下：
// extern int globalvalue;
int globalvalue = 1000;

// 本文件可见。其他文件无法使用。
static int staticValue = 2000;

// static 修饰函数，表示函数只能在本文件使用。
static void tfunction1()
{
    static int funcStaticVal = 0;
    logdebug("globalvalue=%d, funcStaticVal=%d", globalvalue++, funcStaticVal++);
}

void tfunction2()
{
    // 函数内有效
    int tmpvalue = 654;
    logdebug("staticValue=%d, tmpvalue=%d", staticValue++, tmpvalue++);
    // 函数结束，变量tmpvalue被释放。
}
// inttypes.h 定义了通用头。c99标准。
int main(int argc, char **argv)
{
    // 函数内有效
    int32_t tmpvalue = 3;
    {
        //作用域,作用域内部变量，声明周期为作用域结束。(c99)
        int32_t tmpvalue = -1;
        logdebug("value=%d,size=%ld", tmpvalue, sizeof(tmpvalue));
        tfunction1();
        tfunction2();
        // 域结束，变量tmpvalue被释放。
    }
    {
        //作用域,作用域内部变量，声明周期为作用域结束。(c99)
        int32_t tmpvalue = -2;
        logdebug("value=%d,size=%ld", tmpvalue, sizeof(tmpvalue));
        tfunction1();
        tfunction2();
        // 域结束，变量tmpvalue被释放。
    }
    logdebug("value=%d,size=%ld", tmpvalue, sizeof(tmpvalue));

    int32_t *tmppointor = NULL;
    {
        //作用域,作用域内部变量，声明周期为作用域结束。(c99)
        int32_t tmpvalx = 1;
        tmppointor = &tmpvalx;
        *tmppointor = 123;
        logdebug("pointor=%p,pointor value=%d", tmppointor, *tmppointor);
        // 域结束，变量tmpvalx被释放。
    }
    //这里虽然可能运行正常，但是是存在风险的。这个地址空间被释放了。
    *tmppointor = 234;
    logdebug("pointor=%p,pointor value=%d", tmppointor, *tmppointor);
    return 1;
}



